package 文件io;
import java.io.*;
import java.util.*;

public class 文件分割与合并
{
	public static void main(String[]args)
	{
		//division(new File("/storage/emulated/0/360/test.mp"),1024*1024*20);
		try
		{
			InputStream in1=new FileInputStream(new File("/storage/emulated/0/360/1_temp_test.mp"));
			InputStream in2=new FileInputStream(new File("/storage/emulated/0/360/2_temp_test.mp"));
			InputStream in3=new FileInputStream(new File("/storage/emulated/0/360/3_temp_test.mp"));
			InputStream in4=new FileInputStream(new File("/storage/emulated/0/360/4_temp_test.mp"));
			InputStream in5=new FileInputStream(new File("/storage/emulated/0/360/5_temp_test.mp"));
			//集合工具类 枚举 泛型<> 后面讲到
			Vector<InputStream> v=new Vector<InputStream>();
			v.add(in1);
			v.add(in2);
			v.add(in3);
			v.add(in4);
			v.add(in5);
			Enumeration<InputStream> es=v.elements();
			merge(es);
		}
		catch (FileNotFoundException e)
		{}

	}
	//文件分割 参数 目标文件对象，分割的大小(单位字节)
	private static void division(File targetFile, long cutSize)
	{
		if (targetFile == null)return;
		//总共分割的文件个数 三目运算  总大小除分割大小取余是否为零?是 返回总大小除分割大小: 否 返回总大小除分割大小+1(需要强转int)
		int num=targetFile.length() % cutSize == 0 ?(int)(targetFile.length() / cutSize): (int)(targetFile.length() / cutSize + 1);
		try
		{   //创建输入流 套上缓冲流
			BufferedInputStream in=new BufferedInputStream(new FileInputStream(targetFile));
			BufferedOutputStream out=null;//定义输出流

			byte[] bytes=null;//定义一个每次读取的字节数组
			int len=-1;//同以前用法
			int count=0;//分割的每个新文件需要读取的次数

			//循环输出文件，分成几个循环几次
			for (int i=0;i <num;i++)
			{
				//创建缓冲输出流对象
				out = new BufferedOutputStream(new FileOutputStream("/storage/emulated/0/360/" + (i + 1) + "_temp_" + targetFile.getName()));
				if(cutSize<=1024){
					bytes=new byte[(int)cutSize];
					count=1;//分割大小小于1024b 每个文件只需要读一次
				}else{
					bytes=new byte[1024];
					count=(int)cutSize/1024;//这里只取整，是否有余数后面判断
				}
				while(count>0&&(len=in.read(bytes))!=-1){
					out.write(bytes,0,len);
					out.flush();//刷新缓存
					count--;
				}
				if(cutSize%1024!=0){
					bytes=new byte[(int)cutSize%1024];//有余数再读一次，字节数组大小是余数
					len=in.read(bytes);
					out.write(bytes,0,len);
					out.flush();
					out.close();
				}else{
					out.close();
				}
			}
			System.out.println("分割文件完成!");
			in.close();
		}
		catch (FileNotFoundException e)
		{}
		catch(IOException e){}
	}
	//文件合并，用到合并流  
	private static void merge(Enumeration<InputStream> es){
		//构造一个合并流
		/*
		 SequenceInputStream
		   表示其他输入流的逻辑串联。它从输入流的有序集合开始，
		   并从第一个输入流开始读取，直到到达文件末尾，
		   接着从第二个输入流读取，
		   依次类推，直到到达包含的最后一个输入流的文件末尾为止。
		*/
		SequenceInputStream in=new SequenceInputStream(es);
		try
		{
			BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("/storage/emulated/0/360/test_merge.mp"));
			byte[] bytes=new byte[1024];
			int len=-1;
			while((len=in.read(bytes))!=-1){
				bos.write(bytes,0,len);
				bos.flush();//刷新缓存，不写后台满了自动刷新
			}
			bos.close();
			in.close();
			System.out.println("文件合并成功");
		}
		catch (FileNotFoundException e)
		{}
		catch(IOException e){}
	}
}
